﻿using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using FP_Tree;
using System.Collections.Generic;
using System.Collections;

namespace Pruebas
{
    [TestClass]
    public class TestFPTree
    {
        private FPTree arbol;

        private void setUpEscenario1() {
            arbol = new FPTree();
            List<String> lista = new List<string>();
            lista.Add("a");
            lista.Add("s");
            lista.Add("d");
            lista.Add("f");
            lista.Add("g");
            lista.Add("b");
            arbol.addTransaction(lista);
        }

        private void setUpEscenario2()
        {
            arbol = new FPTree();
            List<String> lista = new List<string>();
            lista.Add("a");
            lista.Add("c");
            lista.Add("d");
            arbol.addTransaction(lista);

            lista = new List<string>();
            lista.Add("a");
            lista.Add("e");
            arbol.addTransaction(lista);

            lista = new List<string>();
            lista.Add("a");
            lista.Add("f");
            lista.Add("e");
            arbol.addTransaction(lista);

            lista = new List<string>();
            lista.Add("b");
            lista.Add("g");
            arbol.addTransaction(lista);

            lista = new List<string>();
            lista.Add("b");
            lista.Add("f");
            arbol.addTransaction(lista);
        }

        [TestMethod]
        public void addTransaction1()
        {
            setUpEscenario1();
            ICollection<FPNode> temp = arbol.getValoresTabla();
            Assert.AreEqual(6, temp.Count);
            foreach(FPNode nodo in temp){
                Assert.AreEqual(nodo.Conteo, 1);
            }
        }

        [TestMethod]
        public void addTransaction2()
        {
            setUpEscenario1();
            List<String> lista = new List<string>();
            lista.Add("a");
            lista.Add("r");
            arbol.addTransaction(lista);
            ICollection<FPNode> temp = arbol.getValoresTabla();
            Assert.AreEqual(7, temp.Count);
            int cont = 0;
            foreach (FPNode nodo in temp)
            {
                if (cont == 0)
                {
                    Assert.AreEqual(nodo.Conteo, 2);
                    cont++;
                }
                else
                    Assert.AreEqual(nodo.Conteo, 1);
            }
        }

        [TestMethod]
        public void TestPodar()
        {
            setUpEscenario2();
        }

        [TestMethod]
        public void TestColgarRama1()
        {
            //crea el nodo null y lo agrega a la tabla
            setUpEscenario1();
            FPTree colgado = new FPTree();
            FPNode nodo = arbol.primerNodo("d");
            arbol.colgarRama(nodo, nodo.Conteo, colgado);
            Assert.AreEqual(3, colgado.getValoresTabla().Count);//3 pero debe ser 2

            setUpEscenario1();
            colgado = new FPTree();
            nodo = arbol.primerNodo("b");
            arbol.colgarRama(nodo, nodo.Conteo, colgado);
            Assert.AreEqual(6, colgado.getValoresTabla().Count);//6 pero debe ser 5

            setUpEscenario1();
            colgado = new FPTree();
            nodo = arbol.primerNodo("f");
            arbol.colgarRama(nodo, nodo.Conteo, colgado);
            Assert.AreEqual(4, colgado.getValoresTabla().Count);//4 pero es 3

            setUpEscenario1();
            colgado = new FPTree();
            nodo = arbol.primerNodo("a");
            arbol.colgarRama(nodo, nodo.Conteo, colgado);
            Assert.AreEqual(1, colgado.getValoresTabla().Count);//1-0

            setUpEscenario1();
            colgado = new FPTree();
            nodo = arbol.primerNodo("g");
            arbol.colgarRama(nodo, nodo.Conteo, colgado);
            Assert.AreEqual(5, colgado.getValoresTabla().Count);//5-4
        }

        [TestMethod]
        public void TestColgarRama2()
        {
            setUpEscenario2();
            FPTree colgado = new FPTree();
            FPNode nodo = arbol.primerNodo("f");
            arbol.colgarRama(nodo, nodo.Conteo, colgado);
            Assert.AreEqual(2, colgado.getValoresTabla().Count);
        }

    }
}
